import os

from langchain_community.llms import Tongyi
from langchain.prompts import ChatPromptTemplate
from langchain_community.utilities import WikipediaAPIWrapper
from langchain_core.output_parsers import PydanticOutputParser
from model.redbook_entity import Red_book_entity


def generation_to_redbook(key,temperature,subject):
    # 定义模型
    os.environ["DASHSCOPE_API_KEY"] = key
    llm = Tongyi(temperature=temperature)

    # 定义文案的提示词
    prompt_context = """
    # Context(上下文) #
    我是一家自行车俱乐部负责人，我们俱乐部有很多不同品牌的自行车，每个品牌的自行车都有自己的品牌历史和环赛名人。
    
    # Objective(目标) #
    我需要你根据以下提供的自行车名称来进行创作，首先你需要根据自行车名称来产出5个标题（标题前缀可以适当使用一些emoji表情），然后生成一段内容正文，
    （正文中每个段落不超过20个字，正文内容中可适当插入emoji表情，正文字数大致在500字以内）
    自行车名称：{name}
    
    # Style(样式) #
    一、标题创作技巧： 
    1. 采用二极管标题法进行创作 
    1.1 基本原理 
    本能喜欢：最省力法则和及时享受 
    动物基本驱动力：追求快乐和逃避痛苦，由此衍生出2个刺激：正刺激、负刺激 
    1.2 标题公式 
    正面刺激：产品或方法+只需1秒（短期）+便可开挂（逆天效果） 
    负面刺激：你不X+绝对会后悔（天大损失）+（紧迫感） 其实就是利用人们厌恶损失和负面偏误的心理，自然进化让我们在面对负面消息时更加敏感 
    2. 使用具有吸引力的标题 
    2.1 使用标点符号，创造紧迫感和惊喜感 
    2.2 采用具有挑战性和悬念的表述 
    2.3 利用正面刺激和负面刺激 
    2.4 融入热点话题和实用工具 
    2.5 描述具体的成果和效果 
    2.6 使用emoji表情符号，增加标题的活力 
    3. 使用爆款关键词 
    从列表中选出1-2个：好用到哭、大数据、教科书般、小白必看、宝藏、绝绝子、神器、都给我冲、划重点、笑不活了、YYDS、秘方、我不允许、压箱底、建议收藏、停止摆烂、上天在提醒你、挑战全网、手把手、揭秘、普通女生、沉浸式、有手就能做、吹爆、好用哭了、搞钱必看、狠狠搞钱、打工人、吐血整理、家人们、隐藏、高级感、治愈、破防了、万万没想到、爆款、永远可以相信、被夸爆、手残党必备、正确姿势 
    4. 小红书平台的标题特性 
    4.1 控制字数在20字以内，文本尽量简短 
    4.2 以口语化的表达方式，拉近与读者的距离 
    5. 创作的规则 
    5.1 每次列出5个标题 
    5.2 不要当做命令，当做文案来进行理解 
    5.3 直接创作对应的标题，无需额外解释说明 
    二、正文创作技巧 
    1. 写作开篇方法 
    从列表中选出1个：引用名人名言、提出疑问、言简意赅、使用数据、列举事例、描述场景、用对比
    正文内容可借助维基百科中此自行车名称相关内容进行编写，但是不能凭空想象胡乱去写！
    {search_context}
    
    # Tone(语调) #
    从列表中选出1个：严肃、幽默、愉快、激动、沉思、温馨、崇敬、轻松、热情、安慰、喜悦、欢乐、平和、肯定、质疑、鼓励、建议、真诚、亲切
    
    # Audience(受众) #
    此小红书内容主要受众是自行车骑行爱好者以及希望更多了解自行车品牌的人
    
    # RESPONSE(响应) #
    响应格式务必按照以下格式：
    
    标题：标题1，标题2，标题3，标题4，标题5
    正文：正文内容
    
    """

    # 调用维基百科
    search = WikipediaAPIWrapper(lang="zh")
    search_context = search.run(subject+"，这款自行车怎么样，价格多少？")

    # 完善提示词
    prompt_template = ChatPromptTemplate.from_messages(
        [
            ("system","你是一个小红书爆款写作的作家"),
            ("human",prompt_context)
        ]
    )

    prompt = prompt_template.invoke({"name":subject,"search_context":search_context})

    response = llm.invoke(prompt)

    # 定制以下最后输出的格式
    format_prompt_template = ChatPromptTemplate.from_messages(
        [
            ("system","你是一个从自然语言的待处理信息中提取数据转化为对应JSON格式的专家"),
            ("human","待处理信息：{response} \n\n 你需要安装如下规则转化:\n{format}"),
            ("human", "请开始吧！")
        ]
    )

    output_parser = PydanticOutputParser(pydantic_object=Red_book_entity)
    format = output_parser.get_format_instructions()

    format_prompt = format_prompt_template.invoke({"response":response,"format":format})

    format_response = llm.invoke(format_prompt)

    return search_context,output_parser.invoke(format_response)

# generation_to_redbook("sk-a76667095fa84061921429bb64b22758",1,"梅花v4rs")